<?php
	/**
	* Esta clase es la encargada de manejar la internacionalización de la
	* aplicación.
	* @version 1.0
	* @created 21/DEC/2012
	* @copyright
	*/

class Language {

	private $lang; // idioma en que se va a trabajar
	private $textsList; // lista de textos que se manejan en la aplicación
    private $langAllowList; // lista de lenguajes soportados

	/**
    * Función constructora de la clase, se inicializan las variables locales.
    * @param string $lang, idioma que se va a manipular en la aplicación
    * @return none
    * @created 21/DEC/2012
    * @author Sebastián Lara <slara@grverice.com>
    */
    public function Language($lang = 'en') {
        $this->textsList = array (
            'en' => array (
                'unknow_error'               => 'Unknow error',
                'internal_error'             => 'There was an internal error, please try again later.',
                'unknow_api_key'             => 'Unknown API key',
                'unknow_command'             => 'Unknown command: {0}',
                'not_data_found'             => 'Not Data Found',
                'missing_parameter'          => 'Missing {0}',
                'positive_digits_validation' => '{0} must be positive digits. Value received: {1}',
                'unknow_parameter'           => 'Unknown {0} : {1}',
                'unexpected_parameter_value' => 'Not recognized value for {0} parameter, expecting one of the following values: {1}. Value received: {2}',
                'invalid_value_parameter'    => 'Invalid {0} : {1}',
                'imei_validation_length'     => 'The {0} must contain exactly {1} digits. {2} received: {3}',
                'invalid_date_format'        => 'Invalid {0}, must accomplish with the following format: {1}. Value received: {2}',
                'unsupported_mobile'         => 'Mobile not supported  by service. Value recibed: {0}',
                'insufficient_credit'        => 'Insufficient credit to send the release order. Credit available: {0}, cost of service: {1} (Credits)',
                '' => '',
                '' => '',
                '' => '',
                '' => '',
                '' => '',
                '' => '',
                '' => '',

            ),

            'es' => array (
                'unknow_error'               => 'Error desconocido',
                'internal_error'             => 'Se ha producido un error interno, por favor intente mas tarde.',
                'unknow_api_key'             => 'Clave de API desconocida',
                'unknow_command'             => 'Comando desconocido: {0}',
                'not_data_found'             => 'Datos No Encontrados',
                'positive_digits_validation' => '{0} debe ser digitos positivos. Valor recibido: {1}',
                'unknow_parameter'           => '{0} desconocido: {1}',
                'unexpected_parameter_value' => 'No se reconoce el valor para el parametro {0}, se esperaba uno de los siguientes valores: {1}. Valor que se recibe: {2}',
                'invalid_value_parameter'    => '{0} invalido: {1}',
                'imei_validation_length'     => 'El {0} debe contener exactamente {1} dígitos. {2} recibido: {3}',
                'invalid_date_format'        => '{0} es invalido, debe cumplir con el siguiente formato: {1}. Valor recibido: {2}',
                'unsupported_mobile'         => 'Modelo no soportado por el servicio. Valor recibido: {0}',
                'insufficient_credit'        => 'Credito insuficiente para enviar la orden de liberacion. Credito disponible: {0}, costo del servicio: {1} (Creditos)',
                '' => '',
                '' => '',
                '' => '',
                '' => '',
                '' => '',

            ),
        );
        $this->langAllowList = array_keys ($this->textsList);
        $this->lang = 'en'; // default language
        if (in_array ($this->lang, $this->langAllowList)) {
        	$this->lang = $lang;
        }

    }

    /**
    * Función constructora de la clase, se inicializan las variables locales.
    * @param string $lang, idioma que se va a manipular en la aplicación
    * @return none
    * @created 21/DEC/2012
    * @author Sebastián Lara <slara@grverice.com>
    */
    function getText($keytext, $additionalTextList = array ()) {
    	$text = '';

    	if (is_int($keytext)) { // es un código de respuesta
    		switch ($keytext) {
    			case 325: // error interno
    				$text = $this->textsList[$this->lang]['internal_error'];
    			break;

                case 326: // API KEY desconocida
                    $text = $this->textsList[$this->lang]['unknow_api_key'];
                break;
                
                case 327: // comando no encontrado
                    $text = $this->textsList[$this->lang]['unknow_command'];
                break;

                case 328: // datos no encontrados
                    $text = $this->textsList[$this->lang]['not_data_found'];
                break;
                
                case 329: // falta un parámetro
                    $text = $this->textsList[$this->lang]['missing_parameter'];
                break;

                case 330: // parámetro desconocido
                    $text = $this->textsList[$this->lang]['unknow_parameter'];
                break;
                
                case 331: // validación de enteros positivos
                    $text = $this->textsList[$this->lang]['positive_digits_validation'];
                break;
                
                case 332: // validación de valores permitidos
                    $text = $this->textsList[$this->lang]['unexpected_parameter_value'];
                break;
                
                case 333: // validación de 15 dígitos en el IMEI
                    $text = $this->textsList[$this->lang]['imei_validation_length'];
                break;

                case 334: // formato de fecha inválido
                    $text = $this->textsList[$this->lang]['invalid_date_format'];
                break;

                case 335: // modelo no soportado por el servicio
                    $text = $this->textsList[$this->lang]['unsupported_mobile'];
                break;
                
                case 336: // credito insuficiente para enviar orden de liberación
                    $text = $this->textsList[$this->lang]['insufficient_credit'];
                break;


    			default:
                    // error desconocido
                    $text = $this->textsList[$this->lang]['unknow_error'];
    			break;
    		}
    	} elseif (isset($textsList[$this->lang][$keytext])) {
	        $text = $textsList[$this->lang][$keytext];
	    } else {
            $text = $keytext;
        }

        if (is_array($additionalTextList) && !empty ($additionalTextList)) {
            $text = $this->replaceMessage($text, $additionalTextList);
        }

	    return $text;
	}


    /**
    *   Función reponsable de reemplazar en un mensaje los valores dinamicos 
    *   del mismo. Ej: con los parámetros: 
    *                           $message="hola {0} hoy es {1}", 
    *                           $args=array("mundo", "lunes") 
    *              retorna: 
    *                           "hola mundo hoy es lunes"
    *   @parameters message: mensaje a ser modificado.
    *               args: array de valores para reemplazar en el mensaje.
    *   @return String, mensaje con los valores reemplazados.
    */
    function replaceMessage($message, $args=array()) {
        $amountItems = count ($args);
        for ($i=0; $i < $amountItems; $i++) {
            $message = str_replace("{".$i."}", $args[$i], $message);
        }       
        return $message;
    }
}